package com.kurt.util;

import lombok.extern.slf4j.Slf4j;

/**
 * 用户上下文工具类
 * 用于存储和获取当前登录用户信息
 * 使用ThreadLocal确保线程安全
 */
@Slf4j
public class UserContext {

    /**
     * 用户ID
     */
    private static final ThreadLocal<Long> USER_ID = new ThreadLocal<>();

    /**
     * 用户名
     */
    private static final ThreadLocal<String> USERNAME = new ThreadLocal<>();

    /**
     * 组织ID
     */
    private static final ThreadLocal<Long> ORGANIZATION_ID = new ThreadLocal<>();

    /**
     * 获取当前用户ID
     *
     * @return 用户ID
     */
    public static Long getUserId() {
        return USER_ID.get();
    }

    /**
     * 设置当前用户ID
     *
     * @param userId 用户ID
     */
    public static void setUserId(Long userId) {
        USER_ID.set(userId);
    }

    /**
     * 获取当前用户名
     *
     * @return 用户名
     */
    public static String getUsername() {
        return USERNAME.get();
    }

    /**
     * 设置当前用户名
     *
     * @param username 用户名
     */
    public static void setUsername(String username) {
        USERNAME.set(username);
    }

    /**
     * 获取当前组织ID
     *
     * @return 组织ID
     */
    public static Long getOrganizationId() {
        return ORGANIZATION_ID.get();
    }

    /**
     * 设置当前组织ID
     *
     * @param organizationId 组织ID
     */
    public static void setOrganizationId(Long organizationId) {
        ORGANIZATION_ID.set(organizationId);
    }

    /**
     * 设置用户上下文信息
     *
     * @param userId         用户ID
     * @param username       用户名
     * @param organizationId 组织ID
     */
    public static void setUserContext(Long userId, String username, Long organizationId) {
        setUserId(userId);
        setUsername(username);
        setOrganizationId(organizationId);
    }

    /**
     * 清除用户上下文信息
     * 在请求结束时调用，防止内存泄漏
     */
    public static void clear() {
        USER_ID.remove();
        USERNAME.remove();
        ORGANIZATION_ID.remove();
    }

    /**
     * 检查是否有用户登录
     *
     * @return 是否有用户登录
     */
    public static boolean hasUser() {
        return getUserId() != null;
    }

    /**
     * 获取用户上下文信息字符串
     *
     * @return 用户上下文信息
     */
    public static String getUserContextInfo() {
        return String.format("用户ID: %s, 用户名: %s, 组织ID: %s",
                getUserId(), getUsername(), getOrganizationId());
    }
}
